/******************************************************************
 *
 *	CyberUPnP for Java
 *
 *	Copyright (C) Satoshi Konno 2002-2003
 *
 *	File: SSDPSearchSocketList.java
 *
 *	Revision;
 *
 *	05/08/03
 *		- first revision.
 *	05/28/03
 *		- Moved post() for SSDPSearchRequest to SSDPResponseSocket.
 *		- Removed open(int).
 *
 ******************************************************************/

package org.cybergarage.upnp.ssdp;

import java.net.InetAddress;
import java.util.Vector;

import org.cybergarage.net.HostInterface;
import org.cybergarage.upnp.device.SearchListener;

public class SSDPSearchSocketList extends Vector
{
    // //////////////////////////////////////////////
    // Constructor
    // //////////////////////////////////////////////

    private InetAddress[] binds         = null;
    private String        multicastIPv4 = SSDP.ADDRESS;
    private String        multicastIPv6 = SSDP.getIPv6Address();
    private int           port          = SSDP.PORT;

    public SSDPSearchSocketList()
    {}

    /**
     * @param binds
     *            The IP address that we will used for bindind the service
     */
    public SSDPSearchSocketList(InetAddress[] binds)
    {
        this.binds = binds;
    }

    /**
     * @param binds
     *            The IP address that we will used for bindind the service
     * @param port
     *            The port that we will used for bindind the service
     * @param multicastIPv4
     *            The IPv4 address that we will used for multicast comunication
     * @param multicastIPv6
     *            The IPv6 address that we will used for multicast comunication
     */
    public SSDPSearchSocketList(InetAddress[] binds, int port, String multicastIPv4,
            String multicastIPv6)
    {
        this.binds = binds;
        this.port = port;
        this.multicastIPv4 = multicastIPv4;
        this.multicastIPv6 = multicastIPv6;
    }

    // //////////////////////////////////////////////
    // Methods
    // //////////////////////////////////////////////

    public SSDPSearchSocket getSSDPSearchSocket(int n)
    {
        return (SSDPSearchSocket) get(n);
    }

    public void addSearchListener(SearchListener listener)
    {
        int nServers = size();
        for (int n = 0; n < nServers; n++ )
        {
            SSDPSearchSocket sock = getSSDPSearchSocket(n);
            sock.addSearchListener(listener);
        }
    }

    // //////////////////////////////////////////////
    // Methods
    // //////////////////////////////////////////////
    /*
     * public boolean open(){ return open(SSDP.ADDRESS,SSDP.getIPv6Address()); }
     */

    public boolean open()
    {
        InetAddress[] binds = this.binds;
        String[] bindAddresses;
        if (binds != null)
        {
            bindAddresses = new String[binds.length];
            for (int i = 0; i < binds.length; i++ )
            {
                bindAddresses[i] = binds[i].getHostAddress();
            }
        }
        else
        {
            int nHostAddrs = HostInterface.getNHostAddresses();
            bindAddresses = new String[nHostAddrs];
            for (int n = 0; n < nHostAddrs; n++ )
            {
                bindAddresses[n] = HostInterface.getHostAddress(n);
            }
        }
        int j = 0;
        for (int i = 0; i < bindAddresses.length; i++ )
        {
            if (bindAddresses[i] != null)
            {
                SSDPSearchSocket ssdpSearchSocket;
                if (HostInterface.isIPv6Address(bindAddresses[i]))
                    ssdpSearchSocket = new SSDPSearchSocket(bindAddresses[i], port, multicastIPv6);
                else
                    ssdpSearchSocket = new SSDPSearchSocket(bindAddresses[i], port, multicastIPv4);
                add(ssdpSearchSocket);
            }
        }
        return true;

        /*
         * int nHostAddrs = HostInterface.getNHostAddresses(); for (int n=0; n<nHostAddrs; n++) {
         * String bindAddr = HostInterface.getHostAddress(n); SSDPSearchSocket ssdpSearchSocket =
         * new SSDPSearchSocket(bindAddr); add(ssdpSearchSocket); } return true;
         */
    }

    public void close()
    {
        int nSockets = size();
        for (int n = 0; n < nSockets; n++ )
        {
            SSDPSearchSocket sock = getSSDPSearchSocket(n);
            sock.close();
        }
        clear();
    }

    // //////////////////////////////////////////////
    // Methods
    // //////////////////////////////////////////////

    public void start()
    {
        int nSockets = size();
        for (int n = 0; n < nSockets; n++ )
        {
            SSDPSearchSocket sock = getSSDPSearchSocket(n);
            sock.start();
        }
    }

    public void stop()
    {
        int nSockets = size();
        for (int n = 0; n < nSockets; n++ )
        {
            SSDPSearchSocket sock = getSSDPSearchSocket(n);
            sock.stop();
        }
    }

}
